dskjal
広告
広告

ComfyUI で使える高速化・VRAM 技術

カテゴリ:deeplearning

ComfyUI は PyTorch attention = FlashAttention がデフォルトで使われる。昔は xformers(中身は FlashAttention)も使われていたが、最近では PyTorch attention を使うことが多い。

ComfyUI のオプションは comfy/cli_args.py を見るのが早い。

目次

ComfyUI のメモリ管理

モデルを VRAM に移動しても RAM 上のモデルは解放されないことに注意

ComfyUI のデフォルト挙動

ComfyUI はワークフローで使うモデルをすべて RAM にロードし、実行中はアンロードできない。Wan 2.2 を fp16 で実行する場合、最低 68.4 GB の RAM が必要になる。Q4_K_M を使う場合は 31 GB の RAM が必要。

モデルサイズ(GB)
umt5_xxl_fp89.0
wan2.2_vae1.4
high-fp1629.0
low-fp1629.0

モデルと VRAM

画像生成モデルの場合、モデルサイズ ≒ VRAM 使用量だが、動画生成モデルでは違う。

動画生成モデルは生成途中の動画データも数 GB の VRAM を使用するので、モデルサイズだけで VRAM が足りるかどうかを判定できない。

RTX 5090 は VRAM 32 GB で Wan 2.2 fp16 は 29 GB なので、モデルがすべて VRAM に乗ると考えがちだが、生成動画分の VRAM と OS 管理分とが必要なので足りない。

PCI Express の帯域がボトルネックになることはまずない

4.0 は2GB/レーン なので、x16 なら 32 GB/s。5.0 は4GB/レーンなので、x16 なら 64GB/s。

モデルの半分以上が VRAM に乗らない場合、推論1回あたりのデータ転送量はモデルサイズと同じになる。このような巨大なモデルで 1 it/s を超えることはないので、PCI Express の帯域がボトルネックになることはまずない。

20 GB のモデルで VRAM に 15 GB 乗っている場合、推論1回あたりのデータ転送量は 10 GB(不足分5GB + 次回推論時に退避させた分の再ロード5GB)になる。このケースで PCI Express 4.0 x16 の場合は、3 it/s までは PCI Express の帯域はボトルネックにならない。

これは演算ボトルネックの画像・動画生成の場合であって、メモリ速度ボトルネックの LLM では PCI Express の帯域がボトルネックになりうる。DDR5 デュアルチャンネルの帯域 > PCI Express 5.0 x16 の帯域なので。

VRAM

GGUF

GGUF はモデル量子化技術。RAM から VRAM へ必要な量だけ転送して実行する。

Block Swap(ComfyUI 0.3.70 以降は非推奨)

モデルの一部を RAM に退避して実行できる。ComfyUI 自体のこの機能が実装されているので、ComfyUI 0.3.70 以降は Block Swap ノードは非推奨となっている。

ComfyUI-MultiGPU DisTorch 2.0

複数 GPU の VRAM と RAM とに好きなようにブロックを割り付けできる

raylight

複数 GPU に分割してモデルを配置でき、それぞれの GPU で独立して画像を同時に生成できる。SD 1.5 と SDXL には非対応。

1枚だけ生成する速度は高速化しないが、複数枚生成する場合のスループットは向上する。たとえば、RTX5090(45万円)で2枚生成する速度と RTX5070Ti(13万円*2 = 26万円)2台で同時に2枚生成する速度とが大体同じ。

pinned-memory

RAM に確保したモデルがページングされなくなる。ページングとは RAM も VRAM も不足した場合、OS が SSD や HDD を使って処理を継続する機能。pinned-memory はこれを無効化する。

つまり pinned-memory が有効な状態で RAM も VRAM も不足すると OOM が発生する。

pinned-memory を無効にするには --disable-pinned-memory オプションをつけて ComfyUI を起動する。

python main.py --disable-pinned-memory

reserve-vram

OS が利用する VRAM 量を指定する。Kijai は --reserve-vram 2 を指定することを推奨している。

最新の ComfyUI は自動で VRAM と RAM とにモデルを割り振る。しかし、OS が VRAM を使用して VRAM が不足すると共有 VRAM が使用され、生成速度が劇的に低下する。reserve-vram はこれを回避できる。

当然 ComfyUI が使用できる VRAM 量が減少するため生成速度は低下する可能性が高い。

python main.py --reserve-vram 2

highvram

ComfyUI はノード実行後、モデルを RAM へ退避し、VRAM を解放する。highvram を指定するとモデルを RAM へ退避しなくなる。

python main.py --highvram

モデルウェイト最適化

量子化

量子化はモデルの表現ビット数を減らしてモデルサイズを減らす。VRAM 速度がボトルネックの場合は推論速度も上がる。メモリ速度がボトルネックになっている LLM では量子化で推論速度も上がるが、演算ボトルネックの画像・動画生成 AI では推論速度は上がらない。

手法説明
GGUF拡張子が GGUF のモデル。VRAM にモデルが乗らなくても RAM にブロックを退避して実行可能
fp8RTX 4000 番台以降ではハードウェアで高速に実行できる
SVDQuantモデルを外れ値とそうでない部分とに分けて量子化する手法。nuncyaku という名前で呼ばれている
TensorRT量子化+生成解像度指定等の最適化で効率的に実行できるようにモデルを変換して高速化する
SageAttentionFlashAttention-2 を INT8 や INT4 で量子化する
8 bit 量子化比較

fp8 はRTX 4000 番台以降での評価。scaled_fp8 は高品質かつ高速なのでベストな選択。

手法品質推論速度
Q8_0fp16 に匹敵遅い
scaled_fp8Q8_0 に匹敵速い
fp8Q5_K_M や Q6_K_M 相当速い

蒸留

モデルファイル名に 4step や 8step が入っていると蒸留モデルの可能性が高い。最近は LoRA 形式で配布されることが多い。

コード最適化

FlashAttention

pytorch 2.2 で FlashAttention-2 に対応し、約2倍高速化した

pytorch 2.5 で cuDNN バックエンドの統合により scaled dot product attention(SDPA)が FlashAttention-2 比で 75% 高速化した。H100 以降の業務用 GPU では cuDNN バックエンドの SDPA がデフォルトで使われる。

FlashAttention-3 は H100 以降の業務用 GPU で使用でき、FlashAttention-2 より 50%~100% 高速。

torch.compile

モデルをネイティブコードに変換して高速化する。SageAttention と同時に使われることが多い。

ComfyUI 公式の TorchCompileModel ノードでできる。初回実行時、モデルのコンパイルに数分かかる。モデルによっては機能しない。

triton

モデルのコードをカスタム GPU カーネルに変換するライブラリ。SageAttention と同時に使われることが多い。

Windows 用バイナリも増えてきて簡単にインストールできるようになった。

pip install -U 'triton-windows<3.3'

SageAttention

アテンションの計算に SageAttention を使うことで高速化する。SDXL は U-Net を使用しており、アテンションはプロンプトの取り込み部分にしか使われていないので、SDXL は SageAttention を使ってもほとんど高速化しない。

SDXL 以降の画像生成・動画生成 AI は拡散トランスフォーマーなので SageAttention で高速化できる。

TeaCache

「モデルに入力するノイズ画像 - デノイズ後の画像」の差分ベクトルはステップ中盤以降はほとんど変化しないことが多い。なのでこの差分ベクトルをキャッシュして使いまわしてデノイズすることで、推論を丸ごとスキップして高速化する。


広告
広告

カテゴリ